package com.crm.excel.upload;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

public abstract class BaseExcel<T> {

	public int totalRows = 0;
	public int totalCells = 0;
	private String errorMsg;
	
	//构造方法
	public BaseExcel() {
		super();
	}
	
	//获取总行数
    public int getTotalRows()  { return totalRows;} 

    //获取总列数
    public int getTotalCells() {  return totalCells;} 

    //获取错误信息
    public String getErrorInfo() { return errorMsg; }  
    
    // @描述：是否是2003的excel，返回true是2003 2003得excel得文件后缀是.xls
    public static boolean isExcel2003(String filePath)  {  
         return filePath.matches("^.+\\.(?i)(xls)$");  
     }  
   
    //@描述：是否是2007的excel，返回true是2007 2007之后得excel文件后缀是.xlxs
    public static boolean isExcel2007(String filePath)  {  
         return filePath.matches("^.+\\.(?i)(xlsx)$");  
     }  
    
    /**
     * 验证EXCEL文件
     * @param filePath
     * @return
     */
    public boolean validateExcel(String filePath) {
		if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
			errorMsg = "文件名不是excel格式";
			return false;
		}
		return true;
	}
    
    /**
     * 读取Excel里面得到信息
     * @return
     */
    public abstract List<T> excelValue(Workbook wb) throws ParseException;
    
    /**
     * 根据excel里面的内容读取信息
     * @param is 输入流
     * @param isExcel2003 excel是2003还是2007版本 2007版本意是是文件后缀为.xlxs
     * @return
     * @throws ParseException 
     */
    public List<T> createExcel(InputStream is, boolean isExcel2003) throws ParseException {
		List<T> list = new ArrayList<>();
		try{
			Workbook wb = null;
			if (isExcel2003) {// 当excel是2003时,创建excel2003
				wb = new HSSFWorkbook(is);
			} else {// 当excel是2007时,创建excel2007
				wb = new XSSFWorkbook(is);
			}
			list= excelValue(wb);// 读取Excel里面客户的信息
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}
    
    /**
     * 读EXCEL文件，获取信息集合
     * @param mFile
     * @return
     */
    public List<T> getExcelInfo(MultipartFile mFile) {
		String fileName = mFile.getOriginalFilename();//获取文件名
		List<T> list = new ArrayList<>();
		try {
			if (!validateExcel(fileName)) {// 验证文件名是否合格
				return null;
			}
			boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本
			if (isExcel2007(fileName)) {
				isExcel2003 = false;
			}
			list = createExcel(mFile.getInputStream(), isExcel2003);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
}
